#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED

/****************************************
 *  Project： LinkListTest
 *  Function:
 *  Description: 链表操作
 *  Author: coder-itl
 ****************************************
 *  Copyright 2021/10/4 by coder-itl
 ****************************************/


#include "stdio.h"
#include "stdlib.h"

#include "DataElement.h"

/**
 * 定义链表的节点,包含数据域和指针域
 * Node: 节点
 * Next: 指针域
 */
typedef struct Node {
    /* 数据域 */
    ElementType data;
    /* 指针域 指向下个节点 */
    struct Node *next;
} Node;

/**
 * LinkList: 头节点
 * 注意: 我们也在定义链表时,习惯性的会定义头节点, 以便统一链表节点的插入和删除操作
 * 头节点也可以称为首元节点,最后一个节点叫做尾元节点
 */
typedef struct LinkList {
    /* 头指针(如果链表有头节点,next 就指向头节点,没有就指向第一个节点) */
    Node *next;
    /* 链表的长度,初始值为 0  */
    int length;
} LinkList;


/**
 * 初始化链表
 * @param linkList  要初始化的链表
 * @param dataArray
 * @param length    链表长度
 */
void InitLinkList(LinkList *linkList, ElementType *dataArray, int length);

/**
 * 在指定的位置插入元素 element
 * @param linkList  要执行插入的链表
 * @param position  要插入元素的位置
 * @param element   要插入的元素
 */
void InsertLinkList(LinkList *linkList, int position, ElementType element);

/**
 * 链表的输出
 * @param linkList
 */
void PrintLinkList(LinkList *linkList);


/**
 * 链表是否为空
 * @param linkList
 * @return TRUE / FALSE
 */
int IsLinkListEmpty(LinkList *linkList);


/**
 * 返回指定位置的元素
 * @param linkList
 * @param position  指定位置
 * @return
 */
ElementType GetLinkListElement(LinkList *linkList, int position);

/**
 * 删除并返回指定位置的元素
 * @param linkList 要执行操作的链表
 * @param position  指定位置
 * @return 删除返回指定位置的元素
 */
ElementType DeleteLinkListElement(LinkList *linkList, int position);

/**
 * 清空链表
 * @param linkList
 */
void ClearLinkList(LinkList *linkList);

#endif // LINKLIST_H_INCLUDED
